/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package orgarqsindex;

/**
 *
 * @author Fernando Molon Toigo e Dyoni Bertuol
 */
public class RowModel {

    private long rg; //código numérico de 10 dígitos, representa o número do registro geral e é a chave primária do arquivo.
    private int rgSize;
    private String name; //campo alfanumérico de 15 posições, representa o primeiro nome da pessoa.
    private int nameSize;
    private String address; //campo alfanumérico de 20 posições, representa o endereço da pessoa.
    private int addressSize;
    private char sex; //campo de um carácter, aceita F para feminino e M para masculino. 
    private int sexSize;
    private int age; //campo numérico de 2 dígitos, representando a idade da pessoa.
    private int ageSize;
    private double salary; //campo em ponto flutuante de 10 dígitos, representando o salário da pessoa.
    private int salarySize;

    public RowModel() {
        rgSize = 10;
        nameSize = 15;
        addressSize = 20;
        sexSize = 1;
        ageSize = 2;
        salarySize = 10;
    }

    public RowModel(String fixedRow) {
        this();
        rg = Long.valueOf(fixedRow.substring(getRgBeginIndex(), getRgBeginIndex() + rgSize));
        name = fixedRow.substring(getNameBeginIndex(), getNameBeginIndex() + nameSize).trim();
        address = fixedRow.substring(getAddressBeginIndex(), getAddressBeginIndex() + addressSize).trim();
        sex = fixedRow.substring(getSexBeginIndex(), getSexBeginIndex() + sexSize).charAt(0);
        age = Integer.valueOf(fixedRow.substring(getAgeBeginIndex(), getAgeBeginIndex() + ageSize));
        salary = Double.valueOf(fixedRow.substring(getSalaryBeginIndex(), getSalaryBeginIndex() + salarySize).replace(",", "."));
    }

    public int getRgSize() {
        return rgSize;
    }

    public int getNameSize() {
        return nameSize;
    }

    public int getAddressSize() {
        return addressSize;
    }

    public int getSexSize() {
        return sexSize;
    }

    public int getAgeSize() {
        return ageSize;
    }

    public int getSalarySize() {
        return salarySize;
    }

    public int getRgBeginIndex() {
        return 0;
    }

    public int getNameBeginIndex() {
        return getRgBeginIndex() + rgSize;
    }

    public int getAddressBeginIndex() {
        return getNameBeginIndex() + nameSize;
    }

    public int getSexBeginIndex() {
        return getAddressBeginIndex() + addressSize;
    }

    public int getAgeBeginIndex() {
        return getSexBeginIndex() + sexSize;
    }

    public int getSalaryBeginIndex() {
        return getAgeBeginIndex() + ageSize;
    }

    public String getRandomFixedRow() {
        RandomGenerator randomGenerator = new RandomGenerator();
        String s;
        int aux;

        //RG
        s = "1"; //retorna somente um valor de no máximo rgSize
        for (int i = 0; i < rgSize; i++) {
            s += "0";
        }
        rg = randomGenerator.generateRandomLong() % Long.parseLong(s);
        rg = Math.abs(rg); //somente valor positivo

        //SEX
        aux = randomGenerator.generatePositiveRandomInt(2);
        if (aux % 2 == 1) {
            sex = 'M';
        } else {
            sex = 'F';
        }

        //NAME
        name = randomGenerator.generateRandomFirstName(sex);
        if (name.length() > nameSize) {
            name = name.substring(0, nameSize); //corta o nome para somente nameSize caracteres
        }
        //ADDRESS
        address = randomGenerator.generateAddress();
        if (address.length() > addressSize) {
            address = address.substring(0, addressSize); //corta o address para somente addressSize caracteres
        }
        //AGE
        age = 0;
        while (age < 14 || age > 99) {
            age = randomGenerator.generatePositiveRandomInt(100); //obriga uma idade mínima e máxima
        }
        //SALARY
        s = "1"; //retorna somente um valor de no máximo salarySize
        for (int i = 0; i < salarySize - 3; i++) {
            s += "0";
        }
        salary = 0;
        while (salary < 650 || salary > 30000) {
            salary = Math.abs(randomGenerator.generateRandomDouble()) * Double.parseDouble(s); //obriga um salário mínimo positivo
        }
        //REGISTRO FIXO COMPLETO
        return String.format("%0" + rgSize + "d"
                + "%-" + nameSize + "s"
                + "%-" + addressSize + "s"
                + "%" + sexSize + "s"
                + "%0" + ageSize + "d"
                + "%0" + salarySize + ".2f",
                rg, name, address, sex, age, salary) + "\r\n"; //remover +"\r\n" para não ficar pulando de linha, apenas usar para facilitar a visualização do .txt
    }

    public int getRowSize() {
        return rgSize + nameSize + addressSize + sexSize + ageSize + salarySize + 2;
    }

    public String getNullRow() {
        return "@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\r\n";
    }

    public String toString() {
        return String.format("RG: %0" + rgSize + "d\n"
                + "Nome: %s\n"
                + "Endereço: %s\n"
                + "Sexo: %s\n"
                + "Idade: %d\n"
                + "Salário: R$ %.2f\n",
                rg, name, address, sex == 'M' ? "Masculino" : "Feminino", age, salary);
    }
}
